import { mergeLocalCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '../../api/cart.js'
// 购物车状态
export default {
  namespaced: true, //
  state: () => ({
    list: []
  }),
  getters: {
    // 1. 计算有效商品列表=》`isEffective = true`
    effectiveList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 2. 计算有效商品的总数量
    effectiveListCounts: (state, getters) => {
      return getters.effectiveList.reduce((acc, item) => acc + item.count, 0)
    },
    // 3. 计算有效商品的总价
    effectiveListTotal: (state, getters) => {
      return getters.effectiveList.reduce((acc, item) => acc + item.count * item.nowPrice, 0)
    },
    // 选中的购物车商品数据
    selectedEffectiveList: (state, getters) => {
      return getters.effectiveList.filter((item) => item.selected)
    },
    // 已选择列表总钱数  selectedList 中所有项的单价*数据进行叠加
    allSelectedPrice (state, getters) {
      return getters.selectedEffectiveList.reduce((a, c) => a + c.count * c.nowPrice, 0)
    },
    // 全选：有效列表中的seleted字段全为true 才为true
    isAll (state, getters) {
      return getters.effectiveList.every(item => item.selected)
    }
  },
  mutations: {
    /**
     * 加入购物车
     * @param {*} state 1.判断当前的商品时候在之前添加或 => 1.添加过改数量 2.没添加过新增
     * @param {*} good
     */
    addCart (state, good) {
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      if (index > -1) {
        state.list[index].count += good.count
        console.log('二次加入', state)
      } else {
        state.list.unshift(good)
        console.log('首次加入', state)
      }
    },
    // 删除购物车里面的数据
    delCart (state, good) {
      const index = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(index, 1)
    },
    // 单选选中状态
    singleCheck (state, { good, selected }) {
      const curItem = state.list.find(item => item.skuId === good.skuId)
      curItem.selected = selected
    },
    // 全选选中状态
    allCheck (state, selected) {
      state.list.forEach(item => {
        item.selected = selected
      })
    },
    // 数量修改商品
    changeCount (state, { good, count }) {
      const curItem = state.list.find(item => item.skuId === good.skuId)
      curItem.count = count
    },
    // 修改list购物车数据
    setList (state, list) {
      state.list = list
    }
  },
  actions: {
    // 合并购物车商品 => 当前登陆人购物车 + 之前本地存储的购物车
    async mergeCartAciton (ctx) {
      /**
       * 1.判断本地购物车是否有数据
       * 2.有=>合并
       */
      if (ctx.state.list.length) {
        const mergeData = ctx.state.list.map(item => {
          return {
            skuId: item.skuId,
            selected: item.selected,
            count: item.count
          }
        })
        await mergeLocalCart(mergeData)
        console.log('合并成功')
      }
      ctx.dispatch('getCartList')
    },
    // 获取当前登录人最新购物车数据
    async getCartList ({ commit }) {
      const { data } = await findCartList()
      commit('setList', data.result)
    },
    /**
     *  加入购物车个
     * @param {*} param0 rootState可以调用兄弟模块
     * @param {*} good
     * @returns
     */
    async addCartAction ({ commit, rootState, dispatch }, good) {
      if (rootState.user.profile.token) {
        // 登陆后加入购物车个
        await insertCart({ skuId: good.skuId, count: good.count })
        // 更新数据
        dispatch('getCartList')
      } else {
        //  未登录加入购物车
        commit('addCart', good)
      }
    },
    // 删除商品里面的数据
    async delCartAction ({ commit, rootState, dispatch }, good) {
      if (rootState.user.profile.token) {
        // 登陆后删除购物车个
        await deleteCart([good.skuId])
        // 更新数据
        dispatch('getCartList')
      } else {
        //  未登录删除购物车
        commit('delCart', good)
      }
    },
    // 单选选中状态
    async singleCheck (ctx, { good, selected }) {
      if (ctx.rootState.user.profile.token) {
        // 已登录 TODO
        await updateCart({ ...good, selected })
        ctx.dispatch('getCartList')
      } else {
        // 未登录 把商品信息加入本地vuex中
        ctx.commit('singleCheck', { good, selected })
      }
    },
    // 全选选中状态
    async allCheck (ctx, selected) {
      if (ctx.rootState.user.profile.token) {
        // 已登录 TODO
        const ids = ctx.getters.effectiveList.map(item => item.skuId)
        await checkAllCart({ selected, ids })
        ctx.dispatch('getCartList')
      } else {
        // 未登录
        ctx.commit('allCheck', selected)
      }
    },
    // 点击修改数量
    async changeCount (ctx, { good, count }) {
      if (ctx.rootState.user.profile.token) {
        // 已登录 TODO
        await updateCart({ ...good, count })
        ctx.dispatch('getCartList')
      } else {
        // 未登录 把商品信息加入本地vuex中
        ctx.commit('changeCount', { good, count })
      }
    }
  }
}
